//策略模式.
//在白話文一點就是 : 當你有大量的if else或switch就可以使用策略模式了 

// 为什么要用 策略模式.如:
var user = {
    login: function(type){
        if(type ="google"){
            doGoogleLoginSomething();
            console.log('google login process');
        }else if(type == "facebook"){
            doFacebookLoginSomething();
            console.log('facebook login process');
        }else {
            doSomething();
            console.log('custom login process');
        }
    }
}

// 上面的代码当想增加一个新的登录方式如"twitter" 的时候, 必须修改 上面的 if else 循环.
// 这样违反了 开放封闭原则.

//開放封閉原則 : 白話文就是當你增加新功能時，盡量不修改原有的程式碼。

//當碰到這種情況時，就可以使用策略模式囉 ~
/**
 *  策略模式就是处理 如下情况.
 * 當使用者有相同的行為，但不同的場景時，有不同的方法。

    例如 : 使用者想要進行登入，但我們可以使用google、facebook等不同的方法來登入。

     在白話文一點就是 : 當你有大量的if else或switch就可以使用策略模式了。
 */

 // 策略模式的定义:
 //定義一系列的演算法，把它們一個個封裝起來，並且可以相互替換。
 /**
  * 
  * login裡面的每一種登入方法就是一種演算法，但他都丟在裡面，
  * 所以我們策略模式就是要將他，一個一個封裝起來，並且可以相互的替換。
  */

  var userStrategy = {
      login:function(strategy){
          strategy();
      }
  }

  var loginStrategy = {
      fb: function(){
          doFacebookLoginSomething();
      },
      google: function(){
          doGoogleLoginSomething();
      },
      custom: function(){
        doSomething();
      },
      twitter:function(){   // 新的登录方式 ,只用在 strategy中添加新的方法即可.
          doTwitterLoginSomething();
      }
  }

  userStrategy.login(loginStrategy.fb); // 此时用facebook登录.
  userStrategy.login(loginStrategy.twitter);
  